#include<iostream>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include<string>
#include<cstring>
#include <stdio.h>
// 更好的写法
#include<cassert>
using namespace std;
int main()
{
    int fds[2];
    int n = pipe(fds);
    assert(n==0);

    // 谁是读 谁是写
    // 0 是 read
    // 1 是 write
    // std::cout<<"fds[0]:"<<fds[0]<<std::endl;
    // std::cout<<"fds[1]:"<<fds[1]<<std::endl;
    pid_t id = fork();
    assert(id>=0);
    const char* s = "我是子进程，我在给你发消息";
    if(id==0)
    {
        // 子进程负责写入
        // 子进程通信代码
        // cout<<111<<endl;
        close(fds[0]);
        // string msg ="hello vscode";
        // std::string msg = "hello world";
        int cnt = 0;
        while(true)
        {
            cnt++;
            char buffer[1024]; // 只有子进程能看到
            snprintf(buffer,sizeof buffer,"child -> parent[%d] say: %s[%d][pid=%d]\n",getppid(),s,cnt,getpid());
            // cout<<buffer<<endl;
            write(fds[1],buffer,strlen(buffer));
            // cout<<"count:"<<cnt<<endl;
            // sleep(10); // 每隔一秒写一次
            break;
        }
        close(fds[1]);
        cout<<"子进程正在关闭写入"<<endl;
        exit(0);
    }
    // 父进程通信代码
    // 父进程表示读取

    close(fds[1]);
    close(fds[0]);
        
    // while(true)
    // {
        
    //     sleep(1);
    //     char buffer[1024];
    //     // cout<<1111111111111111<<endl;
    //     ssize_t n = read(fds[0],buffer,sizeof(buffer)-1);
    //     // cout<<2222222222222222<<endl;
    //     if(n>0)
    //     {
    //         buffer[n]=0;
    //         cout<<"父进程的pid# "<<getpid()<<buffer<<endl;
    //     }else if (n==0)
    //     {
    //         // 读到文件结尾
    //         cout<<"read："<<n<<endl;
    //         break;
        
    //     }
        
        
    // }
    int status;
    n =  waitpid(id,&status,0);
    int mand = (status&0x7f);
    cout<<mand<<endl;
    assert(n==id);
    close(fds[0]);
    return 0;
}